/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package teste;

import config.JdbcConnection;
import config.LogErro;
import controllers.AtributoDimController;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.HashMap;
import models.dados.HibernateUtil;
import models.dados.JdbcDAO;
import models.entidades.Dimensao;
import models.entidades.Procedimento;

/**
 *
 * @author Wenderson
 */
public class ManipulaBanco {

    public static boolean executarProcedimento(Procedimento procedimento) {
        try {
            java.sql.Date data = new java.sql.Date(2012 - 1900, 1, 1);
            
            StringBuilder sb = new StringBuilder();
            sb.append("{call ")
            .append(procedimento.getEsquema())
            .append(".")
            .append(procedimento.getNome())
            .append(" (?)}");
            
            CallableStatement call = JdbcConnection.getConnection().prepareCall(sb.toString());
            call.setDate(1, data);
            
            int retorno = call.executeUpdate();
            
            call.close();
            
            if (retorno == 1) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return false;
    }

    public static boolean inserirDados(Procedimento procedimento, HashMap<String, ArrayList<Object>> lista, int quantidade) {
        PreparedStatement ps = null;
        
        try {
            truncateDados(procedimento);
            
            String nomeDtCarga = AtributoDimController.getNomeDtCarga(procedimento);
            
            ArrayList<String> inserts = getInserts(procedimento, lista, quantidade, nomeDtCarga);
            
            Connection connection = JdbcConnection.getConnection();
            connection.setAutoCommit(false);
            
            java.sql.Date data = new java.sql.Date( 2012 - 1900, 1, 1);
            
            for (int i = 0; i < inserts.size(); i++) {
                String sql = inserts.get(i);
                // System.out.println(i + "  =  " + sql);
                ps = connection.prepareStatement(sql);
                
                int contador = 1;
                
                if (nomeDtCarga != null) {
                    ps.setObject(1, data);
                    contador = 2;
                }
                // System.out.println("SIZE LISTA = " + lista.size());
                for (String atributo : lista.keySet()) {
                    ps.setObject(contador, lista.get(atributo).get(i));
                    sql += lista.get(atributo).get(i) + ", ";
                    // System.out.println("SQL INSERT " + sql);
                    contador++;
                }
                
                int resultado = ps.executeUpdate();
                
                if (resultado != 1) {
                    ps.close();
                    return false;
                }
                ps.close();
            }
            
            connection.commit();
            connection.setAutoCommit(true);
            
            return true;
        } catch (Exception e) {
            LogErro.gravaErro(e);
//            System.out.println(e.getMessage());
//            LogErro.gravaErro(e);e.printStackTrace();
        }
        return false;
    }

    private static boolean truncateDados(Procedimento procedimento) {
        try {
            Connection connection = JdbcConnection.getConnection();
            connection.setAutoCommit(false);
            
            StringBuilder sb = new StringBuilder();
            sb.append("TRUNCATE TABLE ")
            .append(procedimento.getTabAux().getEsquema())
            .append(".")
            .append(procedimento.getTabAux().getNome());
            
            PreparedStatement ps = connection.prepareStatement(sb.toString());
            
            int resultado = ps.executeUpdate();
            
            boolean retorno = false;
            
            if (resultado == 1) {
                retorno = true;
            }
            
            connection.commit();
            connection.setAutoCommit(true);
            ps.close();
            
            return retorno;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return false;
    }
    
    public static boolean deletarDadosDimensao(Dimensao dimensao) {
        try {
            Connection connection = JdbcConnection.getConnection();
            connection.setAutoCommit(false);
            
            StringBuilder sb = new StringBuilder();
            sb.append("DELETE FROM ")
            .append(dimensao.getEsquema())
            .append(".")
            .append(dimensao.getNome());
            
            PreparedStatement ps = connection.prepareStatement(sb.toString());
            
            int resultado = ps.executeUpdate();
            
            boolean retorno = false;
            
            if (resultado == 1) {
                return true;
            }
            
            connection.commit();
            connection.setAutoCommit(true);
            
            ps.close();
            
            return retorno;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return false;
    }

    private static ArrayList<String> getInserts(Procedimento procedimento, HashMap<String, ArrayList<Object>> lista, int quantidade, String nomeDtCarga) {
        try {
            ArrayList<String> resultado = new ArrayList<String>();
            
            for (int i = 0; i < quantidade; i++) {
                StringBuilder sb = new StringBuilder();
                sb.append("INSERT INTO ")
                .append(procedimento.getTabAux().getEsquema())
                .append(".")
                .append(procedimento.getTabAux().getNome())
                .append(" (");
                
                if (nomeDtCarga != null) {
                    sb.append(nomeDtCarga)
                    .append(", ");
                }
                
                for (String atributo : lista.keySet()) {
                    sb.append(atributo)
                    .append(", ");
                }
                
                String str = sb.substring(0, sb.length() - 2);
                
                sb = new StringBuilder(str);
                sb.append(") VALUES (");
                
                if (nomeDtCarga != null) {
                    sb.append("?, ");
                }
                
                for (String atributo : lista.keySet()) {
                    sb.append("?, ");
                }
                
                str = sb.substring(0, sb.length() - 2);
                sb = new StringBuilder(str);
                sb.append(")");
                
                // System.out.println("--- " + sb.toString());
                resultado.add(sb.toString());
            }
            
            return resultado;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }
    
}
